package org.lys.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.lys.enumenates.TrafficLamp;
/*
 * @Retention 
                指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释，则保留策略默认为 RetentionPolicy.CLASS。
	 CLASS 
	          编译器将把注释记录在类文件中，但在运行时 VM 不需要保留注释。 
	RUNTIME 
	          编译器将把注释记录在类文件中，在运行时 VM 将保留注释，因此可以反射性地读取。 
	SOURCE 
	          编译器要丢弃的注释。 
 * @Target
	  指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释，
	  则声明的类型可以用在任一程序元素上。如果存在这样的元注释，则编译器强制实施指定的使用限制。
    ANNOTATION_TYPE 
                        注释类型声明 
	CONSTRUCTOR 
	          构造方法声明 
	FIELD 
	          字段声明（包括枚举常量） 
	LOCAL_VARIABLE 
	          局部变量声明 
	METHOD 
	          方法声明 
	PACKAGE 
	          包声明 
	PARAMETER 
	          参数声明 
	TYPE 
	          类、接口（包括注释类型）或枚举声明 
 */
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation {
	String color() default "blue";
	String value();
	int[] arrayAttr() default {1,2,3};
	TrafficLamp lamp() default TrafficLamp.RED; //lamp 方法不能与原来的枚举中的方法一样
	MetaAnnotation annotationAttr() default @MetaAnnotation("meta");
}
